{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Lecture 1: Course Logistics and Introduction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Objectives\n",
    "\n",
    "+ To introduce predictive science laboratory and the teaching instructors.\n",
    "+ To introduce the class syllabus.\n",
    "+ To help students install the necessary software for running the class notebooks.\n",
    "+ To run a simple Jupyter notebook."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Readings\n",
    "\n",
    "+ These notes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Predictive Science Laboratory (PSL)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Mission of PSL\n",
    "\n",
    "To create artificial intelligence (AI) technologies that accelerate the pace of engineering innovation."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Instructor\n",
    "\n",
    "<img style=\"float: right;\" src=\"https://s.gravatar.com/avatar/043cdaec493a74d26193fba621eb14c1?s=100\">\n",
    "\n",
    "+ Ilias Bilionis\n",
    "+ https://www.predictivesciencelab.org/authors/ebilionis/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Teaching Assistant\n",
    "\n",
    "<img style=\"float: right;\" src=\"https://s.gravatar.com/avatar/a3135db419cf364a0d04e4bf80d0b142?s=100\">\n",
    "\n",
    "+ Rohit Tripathy\n",
    "+ https://www.predictivesciencelab.org/authors/rohit/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Contributing students\n",
    "\n",
    "<a href=\"https://www.predictivesciencelab.org/authors/alana/\">\n",
    "<img style=\"float: left;\" src=\"https://s.gravatar.com/avatar/5989d5495d56f811720bd0b3a725e8e8?s=100\">\n",
    "<a href=\"https://www.predictivesciencelab.org/authors/ali/\">\n",
    "<img style=\"float: left;\" src=\"https://s.gravatar.com/avatar/e8dee898972aa7be1692d11e17046f84?s=100\">\n",
    "<a href=\"https://www.predictivesciencelab.org/authors/andres/\">\n",
    "<img style=\"float: left;\" src=\"https://s.gravatar.com/avatar/0720863208403af71ea67ef451babc7c?s=100\">\n",
    "<a href=\"https://www.predictivesciencelab.org/authors/salar/\">\n",
    "<img style=\"float: left;\" src=\"https://s.gravatar.com/avatar/23c7c857bb46256322f36629637e2430?s=100\">\n",
    "<a href=\"https://www.predictivesciencelab.org/authors/nawalgao/\">\n",
    "<img style=\"float: left;\" src=\"https://s.gravatar.com/avatar/b45a879aafb406700494f8cd0d15a649?s=100\">\n",
    "<a href=\"https://www.predictivesciencelab.org/authors/sharmila/\">\n",
    "<img style=\"float: left;\" src=\"https://s.gravatar.com/avatar/2c478159ba1a39144a34cfc0fc074b81?s=100\">\n",
    "<a href=\"https://www.predictivesciencelab.org/authors/murali/\">\n",
    "<img style=\"float: left;\" src=\"https://s.gravatar.com/avatar/267fee3f9f86061a5a7bf6150c272db3?s=100\">\n",
    "<a href=\"https://www.predictivesciencelab.org/authors/alex_c/\">\n",
    "<img style=\"float: left;\" src=\"https://s.gravatar.com/avatar/397d620afb685b9ee4fbfaea94eb809c?s=100\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Syllabus"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Objective of the class\n",
    "\n",
    "> To introduce the fundamentals of uncertainty quantification to advanced undergraduates or graduate engineering and science students with research interests in the field of predictive modeling."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Specific aims\n",
    "\n",
    "Upon completion of the class, the students will be able to:\n",
    "+ Represent mathematically the uncertainty in the parameters of physical and engineering models.\n",
    "+ Propagate uncertainties through known physics to characterize the uncertainty in quantities of interest.\n",
    "+ Pose inference problems that allow them to combine physical models with data.\n",
    "+ Solve inference problems with analytical, sampling, and optimization techniques.\n",
    "+ Pose and solve the information acquisition problem (which simulation/experiment to run where in order to learn what I want)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Broader impacts\n",
    "\n",
    "+ Improve the students’ practical knowledge on how to carry out interdisciplinary research requiring the combination of various simulation models with data.\n",
    "+ Promote research reproducibility.\n",
    "+ Improve the students’ scientific writing and visualization skills. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## What this class is not\n",
    "\n",
    "+ This is not a probability class.\n",
    "+ This is not a statistics class.\n",
    "+ This is not a machine learning or data analytics class.\n",
    "\n",
    "This class is unique in the sense that it focuses on the needs of engineers and scientists."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## What are the unique needs of engineers and scientists?\n",
    "\n",
    "+ Extensive physical knowledge about the phenomena we study (in the form of differential equations, invariances, symmetries, and more).\n",
    "+ Limited availability of data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## The philosophy of this class\n",
    "\n",
    "+ Develop communication channels between theories and data.\n",
    "+ The communication protocol is based on probability theory (thought of as an extension of logic under uncertainty) with an additional layer of causality (expressed through physical laws and graphical models) and is realized using modern machine learning techniques."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Prerequisites\n",
    "\n",
    "+ Probability theory (MA 416) - But we will spend two weeks on the basics.\n",
    "+ Numerical methods (ME 581) - But we will be providing codes for solving ODEs, PDEs, etc.\n",
    "+ Python progamming - You need to learn Python."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## My probability theory background is a bit rusty, what can I do?\n",
    "\n",
    "Watch lectures 1-12 of [MIT 6.041 / 6.431 (Probability Systems Analysis and Applied Probability)](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-041-probabilistic-systems-analysis-and-applied-probability-fall-2010/)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Textbook\n",
    "\n",
    "+ There is no textbook.\n",
    "+ Mandatory and optional references will be given on every lecture."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Class piazza site\n",
    "\n",
    "+ We will be using piazza to communicate.\n",
    "+ You must already be enrolled.\n",
    "+ Please contact rtripath@purdue.edu if you are not enrolled."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Github repository\n",
    "\n",
    "+ This is where all the material of the class is: https://github.com/PredictiveScienceLab/uq-course\n",
    "+ The material is in the form of Jupyter notebooks.\n",
    "+ Make sure you pull often as the material is continuously updated."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Student evaluation\n",
    "\n",
    "+ 10% participation\n",
    "+ 60% homework\n",
    "+ 30% final project"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## What is participation?\n",
    "\n",
    "+ Come to class.\n",
    "+ Ask me questions.\n",
    "+ Respond to my questions.\n",
    "+ Work on the handouts given out in each class.\n",
    "+ Help others during the handout sessions.\n",
    "+ Actively participate in the piazza forum."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Homework\n",
    "\n",
    "+ There will be 9 homework sets.\n",
    "+ The homework will be of both theoretical (e.g., prove this/solve for that) and of practical nature (e.g., complete a Jupyter notebook to solve a practical problem).\n",
    "+ We will use gradescope.com for the homework submission."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Final project\n",
    "+ The project should be related to your research. The requirements are:\n",
    "\n",
    "    + You must use a simulation model or experimental data from your own research.\n",
    "    + You must pose and solve a predictive modeling problem (more details in the next lecture)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Final project evaluation\n",
    "+ Submit a title and a 300-word abstract due **2/15/2020**.\n",
    "+ Submit a 6-page midterm report due **3/15/2020**. Details on how to write it will be provided.\n",
    "+ Submit a 12 page (maximum) final report due **4/31/2020**. Details on how to write it will be provided."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Final letter Grade\n",
    "\n",
    "For the final letter grade (tentative):\n",
    "+ class mean will be: B\n",
    "+ one standard deviation above the mean will be: A\n",
    "+ one standard deviation below the mean will be: C\n",
    "+ two standard deviations below the mean will be: D\n",
    "+ three standard deviations below the mean: F\n",
    "+ A+ will go to the single best score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Hands-on activity: Install required software for class\n",
    "\n",
    "Please follow the instructions in https://github.com/PredictiveScienceLab/uq-course."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Hands-on activity: Running a simple Jupyter notebook\n",
    "Jupyter notebooks offer an interactive environment to run Python code interactively, directly in your web browser. You can also add text and latex equations."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "## Writing python code"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Add this line to the start of your jupyter notebooks to enable inline plotting :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ME 597 handout 1\n"
     ]
    }
   ],
   "source": [
    "#print out a string. \n",
    "print(\"ME 597 handout 1\")\n",
    "\n",
    "#Note that the format for printing is different in python 2.x. We use python 3.7 in this course. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [],
   "source": [
    "##import some libraries \n",
    "import numpy as np   #matrix and linear algebra\n",
    "import matplotlib.pyplot as plt   #plotting library \n",
    "import seaborn as sns     #Make your plot look better than vanilla matplotlib \n",
    "sns.set()   #use default seaborn settings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [],
   "source": [
    "#define a simple function \n",
    "def f(x):\n",
    "    \"\"\"\n",
    "    Add some documentation here. For example: This function returns the square of the input variable. \n",
    "    \n",
    "    :param x: float\n",
    "    \"\"\"\n",
    "    return x ** 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [],
   "source": [
    "#generate some data \n",
    "x = np.linspace(0, 1, 20)\n",
    "y = f(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "## Plotting "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x12c42f278>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#plot the data and visualize it in the notebook\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.plot(x, y, label = '$y = x^2$', linewidth = 4, marker = 'o', markersize = 10)\n",
    "plt.xlabel('$x$', fontsize = 12)\n",
    "plt.ylabel('$y$', fontsize = 12)\n",
    "plt.legend(loc = 'best', fontsize = 16)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "**Question**: Change the definition of the function f such that it returns $f(x) = x\\mathrm{sin}x$. Plot the function for $x \\in (-2, 2)$. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "## Writing math "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Mathematical notation can be used by enclosing them inside single (inline) or double (seperate) dollar signs. \n",
    "For example: \n",
    "\n",
    "+ This is an inline expression $y|x \\sim \\mathcal{N}(y \\ |\\  \\mathrm{m}(x),\\ \\sigma^2)$. \n",
    "\n",
    "+ This equation is rendered seperately, $$ y|x \\sim \\mathcal{N}(y \\ |\\  \\mathrm{m}(x),\\ \\sigma^2).$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "## Interactive plotting "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Suppose you have a function that whose value depends on a parameter. You can interactively visualize the changes in the function as a result of changing the parameter. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [],
   "source": [
    "#import library for interactive plotting \n",
    "import ipywidgets\n",
    "from ipywidgets import interactive"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [],
   "source": [
    "def f(x, c):\n",
    "    return c* (x**2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [],
   "source": [
    "def plot_f(c=1):\n",
    "    x = list(np.linspace(0, 1, 100))\n",
    "    y = [f(i, c) for i in x]\n",
    "    plt.figure(figsize=(10, 6))\n",
    "    plt.plot(x, y, label = '$y = cx^2$', linewidth = 4)\n",
    "    plt.title('$c = $'+str(c), fontsize = 12)\n",
    "    plt.legend(loc = 'best', fontsize = 16)\n",
    "    plt.xlabel('$x$', fontsize = 12)\n",
    "    plt.ylabel('$y$', fontsize = 12)\n",
    "    plt.ylim(-2.1,2.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bf369d457c14475e955104be6142bf72",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=1.0, description='c', max=6.0, min=-2.0), Output()), _dom_classes=('wi…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "interactive(plot_f, c = (-2, 6, 0.1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "## Importing libraries required in this class"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "The block of code immediately below this cell should execute without any errors.\n",
    "If dit doesn't, this means that you need to install some of the necessary software as describe in the home page of the course.\n",
    "If you are running the notebook on Google Colab, you have to uncomment the ``!pip`` lines.\n",
    "This will install the packages locally."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [],
   "source": [
    "# Remove the '#' from the lines below if you are running on Google Colab\n",
    "#!pip install GPy\n",
    "#!pip install pymc3\n",
    "import GPy\n",
    "import pymc3\n",
    "from tensorflow import keras"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "### Some useful resources\n",
    "\n",
    "1. [Jupyter notebook documentation](http://jupyter-notebook.readthedocs.io/en/stable/index.html).\n",
    "2. [Matplotlib user guide](https://matplotlib.org/users/).\n",
    "3. [ipywidgets user guide](http://ipywidgets.readthedocs.io/en/stable/examples/Using%20Interact.html)."
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "latex_envs": {
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 0
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
